import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:intl/intl.dart';
import 'package:lunar/lunar.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'dart:convert';

/// 任务类型枚举
enum TaskType {
  todo,    // 待办事项
  reminder // 提醒事项
}

/// 统一的任务模型 - 处理待办事项和提醒事项
class TaskItem {
  String id;
  String title;
  String note;
  DateTime dateTime;
  bool hasAlarm;
  bool isCompleted;
  TaskType type;

  TaskItem({
    required this.id,
    required this.title,
    required this.note,
    required this.dateTime,
    this.hasAlarm = false,
    this.isCompleted = false,
    required this.type,
  });

  // 转换为JSON
  Map<String, dynamic> toJson() {
    return {
      'id': id,
      'title': title,
      'note': note,
      'dateTime': dateTime.toIso8601String(),
      'hasAlarm': hasAlarm,
      'isCompleted': isCompleted,
      'type': type.toString(),
    };
  }

  // 从JSON创建对象
  factory TaskItem.fromJson(Map<String, dynamic> json) {
    return TaskItem(
      id: json['id'],
      title: json['title'],
      note: json['note'],
      dateTime: DateTime.parse(json['dateTime']),
      hasAlarm: json['hasAlarm'] ?? false,
      isCompleted: json['isCompleted'] ?? false,
      type: TaskType.values.firstWhere(
        (e) => e.toString() == json['type'],
        orElse: () => TaskType.todo,
      ),
    );
  }

  // 获取任务类型显示名称
  String get typeName {
    switch (type) {
      case TaskType.todo:
        return '待办事项';
      case TaskType.reminder:
        return '提醒事项';
    }
  }

  // 获取任务类型图标
  IconData get typeIcon {
    switch (type) {
      case TaskType.todo:
        return Icons.check_circle_outline;
      case TaskType.reminder:
        return Icons.notifications_outlined;
    }
  }

  // 获取任务类型颜色
  Color get typeColor {
    switch (type) {
      case TaskType.todo:
        return Colors.blue;
      case TaskType.reminder:
        return Colors.orange;
    }
  }
}

/// 日历记录页面控制器
class JiluLogic extends GetxController {
  // 当前选中日期
  final Rx<DateTime> selectedDate = DateTime.now().obs;
  
  // 当前显示的月份
  final Rx<DateTime> currentMonth = DateTime.now().obs;
  
  // 是否显示清单视图（默认为日历视图）
  final RxBool showListView = false.obs;
  
  // 统一的任务列表（包含待办事项和提醒事项）
  final RxList<TaskItem> taskItems = <TaskItem>[].obs;
  
  // 是否展开任务列表
  final RxBool isTaskExpanded = false.obs;
  
  // 当前筛选的任务类型
  final Rx<TaskType> currentFilter = TaskType.todo.obs;
  
  // 获取当前年月日格式化字符串
  String get formattedDate {
    return '${currentMonth.value.year}年${currentMonth.value.month}月${selectedDate.value.day}日';
  }
  
  // 获取当前月的所有日期
  List<DateTime> get daysInMonth {
    final DateTime firstDay = DateTime(currentMonth.value.year, currentMonth.value.month, 1);
    final DateTime lastDay = DateTime(currentMonth.value.year, currentMonth.value.month + 1, 0);
    
    // 计算第一天是周几（0是周日，1是周一，以此类推）
    final int firstWeekday = firstDay.weekday % 7;
    
    // 获取上个月的最后几天来填充第一周
    final List<DateTime> days = [];
    for (int i = 0; i < firstWeekday; i++) {
      days.add(firstDay.subtract(Duration(days: firstWeekday - i)));
    }
    
    // 添加当前月的所有天
    for (int i = 0; i < lastDay.day; i++) {
      days.add(DateTime(firstDay.year, firstDay.month, i + 1));
    }
    
    // 添加下个月的前几天来填充最后一周
    final int remainingDays = 42 - days.length; // 6行7列 = 42天
    for (int i = 0; i < remainingDays; i++) {
      days.add(lastDay.add(Duration(days: i + 1)));
    }
    
    return days;
  }
  
  // 获取农历日期
  String getLunarDate(DateTime date) {
    try {
      final Lunar lunar = Lunar.fromDate(date);
      return lunar.getDayInChinese();
    } catch (e) {
      return '';
    }
  }
  
  // 获取节日或节气信息
  String getFestivalOrJieqi(DateTime date) {
    // 国庆节
    if (date.month == 10 && date.day == 1) {
      return '国庆节';
    }
    
    // 中秋节（这里使用固定日期，实际应该根据农历计算）
    if (date.month == 9 && date.day == 6) {
      return '中秋节';
    }
    
    // 寒露（阳历10月8日前后）
    if (date.month == 10 && date.day == 8) {
      return '寒露';
    }
    
    // 返回农历日期
    return getLunarDate(date);
  }
  
  // 切换到上个月
  void previousMonth() {
    currentMonth.value = DateTime(currentMonth.value.year, currentMonth.value.month - 1, 1);
    update();
  }
  
  // 切换到下个月
  void nextMonth() {
    currentMonth.value = DateTime(currentMonth.value.year, currentMonth.value.month + 1, 1);
    update();
  }
  
  // 选择日期
  void selectDate(DateTime date) {
    selectedDate.value = date;
    update();
  }
  
  // 切换视图（日历/清单）
  void toggleView() {
    showListView.value = !showListView.value;
    update();
  }

  // 显式设置视图模式（避免按钮重复点击导致状态反转）
  // show=true 显示清单视图；show=false 显示日历视图
  void setShowListView(bool show) {
    showListView.value = show;
    update();
  }
  
  // 切换任务列表展开状态
  void toggleTaskExpanded() {
    isTaskExpanded.value = !isTaskExpanded.value;
    update();
  }
  
  // 兼容旧方法名（用于视图中的调用）
  void toggleTodoExpanded() {
    toggleTaskExpanded();
  }
  
  // 兼容旧属性名
  bool get isTodoExpanded => isTaskExpanded.value;
  
  // 切换任务类型筛选
  void setTaskFilter(TaskType filterType) {
    currentFilter.value = filterType;
    update();
  }
  
  // 获取任务总数
  int get taskCount => taskItems.length;
  
  // 获取未完成的任务数量
  int get pendingTaskCount => taskItems.where((item) => !item.isCompleted).length;
  
  // 获取选中日期的任务
  List<TaskItem> get tasksForSelectedDate {
    return taskItems.where((item) => 
      item.dateTime.year == selectedDate.value.year &&
      item.dateTime.month == selectedDate.value.month &&
      item.dateTime.day == selectedDate.value.day
    ).toList();
  }

  /// 判断某个日期是否存在记录（包含：提醒/待办）
  /// 说明：
  /// - 这里将所有 TaskItem（无论是否已完成）都视为“有记录”，用于在日历格子底部显示红点
  /// - 如果你希望仅对未完成的任务显示红点，可将 any 改为对 !isCompleted 的判断
  bool hasItemsOnDate(DateTime date) {
    return taskItems.any((item) =>
      item.dateTime.year == date.year &&
      item.dateTime.month == date.month &&
      item.dateTime.day == date.day
    );
  }
  
  // 获取筛选后的任务列表
  List<TaskItem> get filteredTasks {
    if (currentFilter.value == TaskType.todo) {
      return taskItems.where((item) => item.type == TaskType.todo).toList();
    } else {
      return taskItems.where((item) => item.type == TaskType.reminder).toList();
    }
  }

  // 获取所有任务（按时间升序排序，用于清单视图）
  List<TaskItem> get allTasksSorted {
    final list = List<TaskItem>.from(taskItems);
    list.sort((a, b) => a.dateTime.compareTo(b.dateTime));
    return list;
  }
  
  // 保存任务到本地存储
  Future<void> saveTasks() async {
    try {
      final prefs = await SharedPreferences.getInstance();
      final jsonList = taskItems.map((item) => jsonEncode(item.toJson())).toList();
      await prefs.setStringList('task_items', jsonList);
    } catch (e) {
      print('保存任务失败: $e');
    }
  }
  
  // 从本地存储加载任务
  Future<void> loadTasks() async {
    try {
      final prefs = await SharedPreferences.getInstance();
      final jsonList = prefs.getStringList('task_items') ?? [];
      
      taskItems.value = jsonList
          .map((jsonStr) => TaskItem.fromJson(jsonDecode(jsonStr)))
          .toList();
    } catch (e) {
      print('加载任务失败: $e');
    }
  }
  
  // 添加任务
  void addTask(TaskItem item) {
    taskItems.add(item);
    saveTasks();
    update();
  }
  
  // 删除任务
  void deleteTask(String id) {
    taskItems.removeWhere((item) => item.id == id);
    saveTasks();
    update();
  }
  
  // 更新任务
  void updateTask(TaskItem item) {
    final index = taskItems.indexWhere((element) => element.id == item.id);
    if (index != -1) {
      taskItems[index] = item;
      saveTasks();
      update();
    }
  }
  
  // 切换任务完成状态
  void toggleTaskCompletion(String id) {
    final index = taskItems.indexWhere((item) => item.id == id);
    if (index != -1) {
      taskItems[index].isCompleted = !taskItems[index].isCompleted;
      saveTasks();
      update();
    }
  }
  
  @override
  void onInit() {
    super.onInit();
    // 初始化时设置当前选中日期
    selectedDate.value = DateTime.now();
    currentMonth.value = DateTime(DateTime.now().year, DateTime.now().month, 1);
    // 加载任务
    loadTasks();
  }
}